/******************** (C) COPYRIGHT 2014 SONiX *******************************
* COMPANY:			SONiX
* DATE:					2014/01
* AUTHOR:				SA1
* IC:						SN32F240
* DESCRIPTION:	
*____________________________________________________________________________
* REVISION	Date				User		Description
*
*____________________________________________________________________________
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS TIME TO MARKET.
* SONiX SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL 
* DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF SUCH SOFTWARE
* AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN 
* IN CONNECTION WITH THEIR PRODUCTS.
*****************************************************************************/

/*_____ I N C L U D E S ____________________________________________________*/
#include "stdlib.h"
#include <SN32F280.h>
#include "OLED_Display.h"
#include "LED_Driver.h"
#include "LED_Code.h"
#include "OLED_Code.h"
#include "LED_Display.h"
#include "SLED_Display.h"
#include	"..\UsbHid\hid.h"
#include	"..\UsbHid\hidram.h"
#include "..\Driver\PWM.h"
#include "..\Project\FlashRom.h"
#include "..\KB\KB_Flash.h"
#include "..\KB\KB_API.h"
#include "..\KB\KB_API_Tab.h"
#include "..\KB\KB_Scan.h"
#include "..\KB\KB_BT.h"

/*_____ D E C L A R A T I O N S ____________________________________________*/
uint8_t f_SLED_update;
uint8_t rSLED_mode;
uint8_t rSLED_user_mode;
uint8_t rSLED_update_cnt_set;
uint16_t rSLED_update_cnt_reload;
uint16_t rSLED_update_cnt;

uint8_t f_SLED_off;
uint8_t rSLED_index;
uint8_t rSLED_value;

void SLED_Speed_Update(void);
void SLED_iPWMBuf_Update(void);
void SLED_const_init(void);
void SLED_breath_init(void);
void SLED_off_init(void);
void SLED_const_design(void);
void SLED_breath_design(void);
void SLED_off_design(void);
/*_____ M A C R O S ________________________________________________________*/

/*_____ F U N C T I O N S __________________________________________________*/
/*****************************************************************************
* Function		: OLED_Init
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_Init(void)
{
	if(rWheel_mode == WHEEL_VOL_MODE)
		rSLED_user_mode = SLED_USER_CONST;
	else
		rSLED_user_mode = SLED_USER_BREATH;
	SLED_user_mode_switch();
}

/*****************************************************************************
* Function		: OLED_Display
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_Display(void)
{
	if(f_SLED_update)
	{
		f_SLED_update = 0;
		switch(rSLED_mode)
		{
			case SLED_CONST_MODE:			SLED_const_design();		break;
			case SLED_BREATH_MODE:		SLED_breath_design();		break;
			case SLED_OFF_MODE:				SLED_off_design();			break;
			default:		break;
		}
		SLED_iPWMBuf_Update();	
	}
}

/*****************************************************************************
* Function		: SLED_iPWMBuf_Update
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_iPWMBuf_Update(void)
{
	if((f_USB_NoSignal)&&(rSys_mode == SYS_USB_MODE))
	{
		iRPWM_Buf[LED_WHEEL] = 0;
		return;
	}
	
	if(f_SLED_off)
		iRPWM_Buf[LED_WHEEL] = 0;
	else
		iRPWM_Buf[LED_WHEEL] = rSLED_value;
}

/*****************************************************************************
* Function		: SLED_user_mode_switch
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_user_mode_switch(void)
{
	switch(rSLED_user_mode)
	{
		case SLED_USER_CONST:				SLED_const_init();			break;
		case SLED_USER_BREATH:			SLED_breath_init();			break;
		case SLED_USER_OFF:					SLED_off_init();				break;
		default:	break;
	}
}
/*****************************************************************************
* Function		: SLED_const_init
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_const_init(void)
{
	rSLED_mode = rSLED_user_mode;
	rSLED_update_cnt_set = SLED_CONST_TIME;
	SLED_Speed_Update();

}

/*****************************************************************************
* Function		: OLED_const_design
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_const_design(void)
{
	rSLED_value = PWM_MAX;
}

/*****************************************************************************
* Function		: SLED_breath_init
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_breath_init(void)
{
	rSLED_mode = SLED_BREATH_MODE;
	rSLED_update_cnt_set = SLED_BREATH_TIME;
	SLED_Speed_Update();

}

/*****************************************************************************
* Function		: OLED_const_design
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_breath_design(void)
{
	rSLED_value = LED_BREATH_TAB[rSLED_index];
	rSLED_index++;
	if(rSLED_index>=LED_BREATH_TAB_LEN)
	{
		rSLED_index = 0;	
	}
}

/*****************************************************************************
* Function		: SLED_off_init
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_off_init(void)
{
	rSLED_mode = SLED_OFF_MODE;
	rSLED_update_cnt_set = SLED_OFF_TIME;
	SLED_Speed_Update();

}

/*****************************************************************************
* Function		: SLED_off_design
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_off_design(void)
{

}

/*****************************************************************************
* Function		: SLED_Speed_Update
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_Speed_Update(void)
{
	rSLED_update_cnt = rSLED_update_cnt_set;
	rSLED_update_cnt_reload = rSLED_update_cnt_set;
}

/*****************************************************************************
* Function		: SLED_Update_Chat
* Description	: 
* Input			: None
* Output		: None
* Return		: None
* Note			: None
*****************************************************************************/
void SLED_Update_Chat(void)
{
	if(--rSLED_update_cnt == 0)
	{
		rSLED_update_cnt = rSLED_update_cnt_reload;
		f_SLED_update = 1;
	}
}
